package com.yc.framework.baseClass;

import java.io.InputStream;
import java.util.Collection;
import java.util.List;

import com.baomidou.mybatisplus.core.conditions.Wrapper;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.service.IService;
import com.yc.system.entity.Book;

/**
 * <p>
 * 通用Service
 * </p>
 *
 * 
 */
public interface BaseService<M> extends IService<M> {

	/**
	 * 保存实体
	 * 
	 * @param model 实体
	 * @return 是否保存成功
	 */
	R saveModel(M model);

	/**
	 * 保存或修改实体
	 * 
	 * @param model 实体对象
	 * @return 是否保存或修改成功
	 */
	R saveOrUpdateModel(M model);

	/**
	 * 批量保存
	 * 
	 * @param modelList 实体列表
	 * @return 是否保存成功
	 */
	R saveModelBatch(Collection<M> modelList);

	/**
	 * 批量保存或修改，没有id则保存，有id则修改
	 *
	 * @param modelList 实体列表
	 * @return 是否成功
	 */
	R saveOrUpdateModelBatch(Collection<M> modelList);

	/**
	 * 根据主键删除
	 *
	 * @param id 主键
	 * @return 是否删除成功
	 */
	R removeModelById(String id);

//	/**
//	 * 根据主键删除
//	 *
//	 * @param m 对象
//	 * @return 是否删除成功
//	 */
//	R removeModelById(M m);
//
//	/**
//	 * 根据主键列表删除
//	 *
//	 * @param modelList 包含主键列表
//	 * @return 是否修改成功
//	 */
//	R removeModelByIdList(List<M> modelList);

	/**
	 * 根据主键修改对象
	 *
	 * @param model 待修改对象
	 * @return 是否修改成功
	 */
	R updateModelById(M model);

	/**
	 * 根据主键批量一个一个修改
	 *
	 * @param idList 待修改列表
	 * @return 是否修改成功
	 */
	R updateModelByIdBatch(List<M> idList);

	/**
	 * 根据调解批量修改对象
	 *
	 * @param model   修改的值
	 * @param wrapper 条件
	 * @return 是否修改成功
	 */
	R updateModelBatch(M model, Wrapper<M> wrapper);

	/**
	 * 根据主键获取对象，并封装至R中
	 *
	 * @param id 主键
	 * @return R结果
	 */
	R getModelById(String id);

//	/**
//	 * 基础版导出数据
//	 *
//	 * @param clz   导入数据类型
//	 * @param input 导入数据流
//	 * @return 是否导入成功
//	 */
//	R importHandler(Class<M> clz, InputStream input);

	/**
	 * 以List形式 返回所有未被删除的数据，
	 *
	 * @return List集合
	 */
	List<M> list();

	/**
	 * 以List形式 返回根据跳槽查询的且未被删除的数据
	 *
	 * @param model 参数
	 * @param <T>   参数类型
	 * @return List集合
	 */
	<T extends M> List<M> listByModel(T model);

	public R removeModelByIds(String ids);


}